package com.Atao.exception;

import com.Atao.pojo.Result;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.sql.SQLIntegrityConstraintViolationException;

@RestControllerAdvice
public class GlobalException {

    // 优先处理数据完整性异常
    @ExceptionHandler(DataIntegrityViolationException.class)
    public Result handleDataIntegrityViolation(DataIntegrityViolationException e) {
        // 提取根本原因
        Throwable rootCause = e.getMostSpecificCause();

        // 判断是否为外键约束冲突
        if (rootCause instanceof SQLIntegrityConstraintViolationException) {
            String errorMsg = rootCause.getMessage();
            // 识别特定错误信息特征
            if (errorMsg.contains("foreign key constraint")
                    && errorMsg.contains("Cannot delete or update a parent row")) {
                return Result.error("当前文章分类含有文章，不能删除");
            }
        }
        // 其他类型的数据完整性异常（如唯一约束冲突）仍返回默认提示
        return Result.error("操作违反数据完整性：" + rootCause.getMessage());
    }

    // 处理文章标题长度和格式异常
    @ExceptionHandler(IllegalArgumentException.class)
    public Result handleIllegalArgumentException(IllegalArgumentException e) {
        String errorMsg = e.getMessage();
        if (errorMsg != null && errorMsg.contains("文章标题")) {
            return Result.error("文章标题要在1-25个字符之间，且不能有空格");
        }
        return Result.error(errorMsg);
    }

    // 处理参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        if (bindingResult.hasFieldErrors("title")) {
            return Result.error("文章标题要在1-25个字符之间，且不能有空格");
        }
        return Result.error("每一项都是必填项，不能留空");
    }

    // 保留其他异常处理（注意顺序要在更通用的Exception之前）
    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e) {
        e.printStackTrace();
        return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
    }
}